package com.timo.shopp.management.service;

/**
 * @Author: Timo
 * @Date: 2019/3/24 14:46
 * @Description: 类用途：
 */

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * redis 操作接口
 *
 * @author blank
 * @since 2018/5/28 下午5:44
 */
public interface RedisService {

    /**
     * 保存数据到 Redis 缓存中
     *
     * @param key   键名
     * @param value 保存对象
     * @return 操作结果 true 成功 false 失败
     * @author blank
     * @since 2018/5/28 下午5:49
     */
    void set(String key, Object value);

    /**
     * 保存数据到 Redis 缓存中 指定秒数后过期
     *
     * @param key     键名
     * @param value   保存对象
     * @param seconds 多少秒后过期
     * @return 操作结果 true 成功 false 失败
     * @author blank
     * @since 2018/5/28 下午5:49
     */
    void set(String key, Object value, long seconds);

    /**
     * 保存数据到 Redis 缓存中 指定单位时间后过期
     *
     * @param key      键名
     * @param value    保存对象
     * @param timeUnit 时间类型
     * @param time     多少单位时间(取决于上一参数)后过期
     * @return 操作结果 true 成功 false 失败
     * @author blank
     * @see TimeUnit
     * @since 2018/5/28 下午5:49
     */
    void set(String key, Object value, TimeUnit timeUnit, long time);

    /**
     * 保存列表数据到 Redis 缓存中
     *
     * @param key  键名
     * @param list 保存对象列表
     * @return 操作结果 true 成功 false 失败
     * @author blank
     * @since 2018/5/28 下午5:58
     */
    <T> void setList(String key, List<T> list);

    /**
     * 从 Redis 缓存中获取数据
     *
     * @param key 数据对应的 键名
     * @param clz 列表对象的class
     * @return key 对应的数据
     * @author blank
     * @since 2018/5/28 下午5:59
     */
    <T> List<T> getList(String key, Class<T> clz);

    /**
     * 从 Redis 缓存中获取数据 泛型
     *
     * @param key 键名
     * @param clz 列表对象的class
     * @return key 对应的数据
     * @author blank
     * @since 2018/5/28 下午5:50
     */
    <T> T get(String key, Class<T> clz);

    /**
     * 删除指定 key 的 对象
     *
     * @param key 指定对象的 key
     * @return 操作结果 true 成功 false 失败
     * @author blank
     * @since 2018/5/29 下午12:09
     */
    Boolean remove(String key);

    /**
     * 设置 key 对应的数据的过期时间
     *
     * @param key           键名
     * @param expireSeconds 过期时间秒
     * @return 操作结果 true 成功 false 失败
     * @author blank
     * @since 2018/5/28 下午5:56
     */
    boolean expire(String key, long expireSeconds);

    /**
     * 设置 key 对应的数据在指定单位时间后过期
     *
     * @param key      键名
     * @param timeUnit 时间类型
     * @param time     多少单位时间(取决于上一参数)后过期
     * @return 操作结果 true 成功 false 失败
     * @author blank
     * @see TimeUnit
     * @since 2018/5/28 下午5:56
     */
    boolean expire(String key, TimeUnit timeUnit, long time);
}